package com.trade.module.base.service.impl;

import com.trade.module.base.entity.ResourceRole;
import com.trade.module.base.entity.Role;
import com.trade.module.base.entity.Resource;
import com.trade.module.base.repository.ResourceRepository;
import com.trade.module.base.repository.ResourceRoleRepository;
import com.trade.module.base.repository.RoleRepository;
import com.trade.module.base.service.RoleService;
import com.trade.common.utils.*;
import com.trade.module.base.vo.RoleVo;
import lombok.extern.log4j.Log4j;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;

/**
 * Class Description:
 *
 * @Version v1.0 2017/4/22 0:20
 * @JDK version 1.8.0_51
 * @Author zfb
 */
@Log4j
@Service
@Transactional
public class RoleServiceImpl implements RoleService{

    /**
     * 注入角色服务层
     */
    @Autowired
    private RoleRepository roleRepository;

    /**
     * 注入资源服务层
     */
    @Autowired
    private ResourceRepository resourceRepository;

    /**
     * 注入资源角色服务层
     */
    @Autowired
    private ResourceRoleRepository resourceRoleRepository;


    /**
     * 根据用户Id和数据状态查询角色信息
     *
     * @param userId 用户id
     * @return Role 角色迭代器
     */
    @Override
    public Iterable<Role> findRoleByUserId(String userId) {
        return roleRepository.findRoleByUserId(userId, Constants.ROLE_FLAG_USERED,
                Constants.DATA_FLAG_OK,Constants.DATA_FLAG_OK);
    }

    /**
     * 查询角色及角色在某平台中可用的资源信息
     *
     * @return List<RoleVo> 角色集合
     */
    @Override
    public List<RoleVo> findRoleAndResource() {
        List<RoleVo> roleVos = new ArrayList<>();
        Iterable<Role> roles = roleRepository.findByDataFlagAndRoleFlag(
                Constants.DATA_FLAG_OK,Constants.ROLE_FLAG_USERED);
        if(null!=roles){
            for (Role role : roles) {
                RoleVo roleVo = new RoleVo();
                try {
                    BeanUtil.copyAllProperties(role, roleVo);
                } catch (Exception e) {
                    log.error("对象转换失败，对象信息：" + JSONObject.fromObject(role).toString());
                    e.printStackTrace();
                }
                List<Resource> resList = resourceRepository.findResByRoleId(roleVo.getId(),
                        Constants.DATA_FLAG_OK, Constants.DATA_FLAG_OK);
                roleVo.setResourceList(resList);
                roleVos.add(roleVo);
            }
        }
        return roleVos;
    }

    /**
     * 新建角色
     *
     * @param roleVo 角色vo对象
     * @return Role 角色
     */
    @Override
    @Transactional
    public Role save(RoleVo roleVo) {
        //如果角色可用，进行下一步操作
        if (roleVo != null){
            //查询角色编码是否重复，如果已存在角色编码，则角色编码不能使用
            SearchFilter searchFilter = new SearchFilter("roleCode", SearchFilter.Operator.EQ, roleVo.getRoleCode());
            List<SearchFilter> searchFilterList = new ArrayList<>();
            searchFilterList.add(searchFilter);
            Role rolePo = roleRepository.findOne(DynamicSpecifications.bySearchFilter(searchFilterList, Role.class));
            if (rolePo == null){
                rolePo = new Role();
                try {
                    BeanUtil.copyAllProperties(roleVo, rolePo);
                } catch (Exception e) {
                    log.error("角色信息转换出错，角色存储失败，角色信息：" + JSONObject.fromObject(roleVo));
                    e.printStackTrace();
                    return null;
                }
                //存储角色信息
                rolePo = roleRepository.save(rolePo);

                //存储角色资源信息
                if (XaUtil.isNotEmpty(roleVo.getRoleResourceRelationList())){
                    ArrayList<ResourceRole> roleResList = new ArrayList<>();
                    for(ResourceRole resourceRole : roleVo.getRoleResourceRelationList()){
                        ResourceRole roleRes = new ResourceRole();
                        roleRes.setModifyId(roleVo.getModifyId());
                        roleRes.setCreaterId(roleVo.getCreaterId());
                        roleRes.setResourceId(resourceRole.getResourceId());
                        roleRes.setRoleId(rolePo.getId());
                        roleRes.setDataFlag(Constants.DATA_FLAG_OK);
                        roleResList.add(roleRes);
                    }
                    resourceRoleRepository.save(roleResList);
                }
                return rolePo;
            } else {
                log.error("创建角色失败，角色编码【"+rolePo.getRoleCode()+"】已存在");
                return null;
            }
        }else{
            log.error("创建角色失败，传入的角色信息为null");
            return null;
        }
    }
}
